import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import router from '@/router'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    const token = store.getters.token
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  response => {
    // console.log(response)
    const { success, message } = response.data
    // response参数,axios响应对象(里面config/header/status/data字段)
    // data字段里对应的数据才是后台返回的全部数据
    if (success) {
      // 第一个data:是axios自带的
      // 第二个data:是后台返回数据对象的
      return response.data
    } else {
      // 逻辑失败(把后台返回的message提示文字返回发到逻辑页面)
      // 返回promise的reject拒绝状态(await无法接受,如果有try,catch进catch里)
      Message.error(message)
      return Promise.reject(message)
    }
  },
  error => {
    console.dir(error)

    Message.error(
      // 4xx/5xx的响应状态,如果后台返回了响应数据,就用一下,如果没有,就是error对象本身message值
      // null.data为了防止报错
      (error.response && error.response.data && error.response.data.message) ||
        error.message
    )
    // 知识点: ?. (可选链操作符)新版的语法 (10002 和后台商定的值,代表token过期)
    // 左侧有值才会继续往下去点属性(防止空值去,任意的属性报错)
    if (error?.response?.data?.code === 10002) {
      // 1.删除token
      // 2.删除用户信息
      // 3.跳转login页面(被动退出时,所在页面的路由地址字符串传递给登录页面)
      console.log(router)
      console.log(router.currentRoute.fullPath)
      store.dispatch('user/loginOutActions')
      router.replace(`/login?redirect=${router.currentRoute.fullPath}`)
    }
    return Promise.reject(error)
  }
)

export default service
